#include "comm.hpp"


int main()
{
    // 创建共享内存
    int shmid = CreatShm();

    // 将共享内存挂接到进程的虚拟地址空间
    char* shmadder = (char*)shmat(shmid,nullptr,0);// nullptr不指定挂接地址  0不指定权限
    if(shmadder == nullptr)
    {
        perror("shmat fail");
        exit(-1);
    }

    //sleep(100);
    
    // while(1)
    // { 
    //     cout<<"proa 收到："<<shmadder<<endl;
    //     if(memcmp(shmadder,"quit",4) == 0)break;
    //     sleep(2);
    // }

    // 查看共享内存的属性
    // shmctl ---> IPC_STAT
    // struct shmid_ds buf;
    // shmctl(shmid,IPC_STAT,&buf);

    // cout<<"创建共享内存的进程PID: "<<(buf.shm_cpid)<<endl;
    // cout<<"共享内存链接数:"<<(buf.shm_nattch)<<endl;
    // cout<<"创建共享内存的进程PID(getpid):"<<getpid()<<endl;
    // cout<<endl;

    // struct ipc_perm tmp;
    // tmp = buf.shm_perm;
    // cout<<"key:"<<(tmp.__key)<<endl;



    // 实验目的：当主动去shmctl销毁一块共享内存时，若有其它进程还挂接在这块共享内存，进程还能使用这块共享内存吗？
    // 实验步骤：proa 走10秒  prob 挂接共享内存一直正常运行 
    //          proa 10秒走完对共享内存进行销毁shmctl
    //          while true; do ipcs -m; sleep 1; done 
    int cnt = 10;
    while(cnt)
    {
        sleep(1);
        cout<<"proa 运行中 "<<cnt<<endl;
        cnt--;
    }
    // 去关联
    shmdt(shmadder);

    // 销毁
    int n = shmctl(shmid,IPC_RMID,nullptr);
    if(n == -1)cout<<"销毁失败"<<endl;
    else cout<<"销毁成功"<<endl;

    return 0;
}